#ifndef XTOOLS_H
#define XTOOLS_H
#include <iostream>
#include <mutex>
#include <thread>
///////////////////// 日志 ///////////
// 日志级别
enum XLogLevel {
  XLOG_TYPE_DEBUG,
  XLOG_TYPE_INFO,
  XLOG_TYPE_ERROR,
  XLOG_TYPE_FATAL,
};
#define LOG_MIN_LEVEL 0

#define XLOG(s, level)                                                         \
  if ((level) > LOG_MIN_LEVEL)                                                 \
  std::cout << level << __FILE__ << ":" << __LINE__ << ":" << s << std::endl

#define XLOGDEBUG(s) XLOG(s, XLOG_TYPE_DEBUG)
#define XLOGINFO(s) XLOG(s, XLOG_TYPE_INFO)
#define XLOGERROR(s) XLOG(s, XLOG_TYPE_ERROR)
#define XLOGFATAL(s) XLOG(s, XLOG_TYPE_FATAL)
///////////////////// 结束日志 ///////////
void MSleep(unsigned int ms);

// 获取当前时间戳 毫秒
long long NowMs();

class XThread {
public:
  virtual ~XThread() {}
  // 启动线程
  virtual void Start();
  // 线程退出标志位，如果为true那么表示因该退出，需要在入口函数做处理
  bool is_exit() { return is_exit_; }
  // 设置线程退出标志位为true，并等待线程退出
  virtual void Stop();

protected:
  // 线程入口函数
  virtual void Main() = 0;
  bool is_exit_ = false;
  int index_ = 0;

private:
  std::thread th_;
  std::mutex m_;
};

class XTools {
public:
};

#endif // XTOOLS_H
